const express = require("express");
const {
  getAllTravel,
  saveTravel,
  updateTravel,
  deleteTravel,
  getMedia,
  updateIsOnline,
} = require("../../router_handler/admin/travel");
const router = express.Router(); // 创建一个路由器
const fs = require("fs"); // 导入文件系统模块
const multer = require("multer"); // 导入文件上传模块
const path = require("path"); // 导入路径模块
const sharp = require("sharp");

/**
 * 获取信息的请求处理函数
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */

router.get("/info/:page/:limit/", async (req, res) => {
  const page = req.params.page; // 获取页码
  const limit = req.params.limit; // 获取每页数据数量
  const keyword = req.query.keyword; // 获取关键字
  const local = req.query.local; // 获取地点

  // 计算数据库查询的偏移量
  const offset = (page - 1) * limit;
  const result = await getAllTravel(keyword, local, offset, limit);
  res.send(result);
});

/**
 * 保存信息的请求处理函数
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
router.post("/save", async (req, res) => {
  const reuslt = await saveTravel(req.body);
  res.send(reuslt);
});

/**
 * 更新信息的请求处理函数
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
router.put("/update", async (req, res) => {
  const result = await updateTravel(req.body);
  res.send(result);
});

/**
 * 删除信息的请求处理函数
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
router.delete("/remove/:id", async (req, res) => {
  const id = req.params.id;
  const result = await deleteTravel(id);
  res.send(result);
});

/**
 * 文件上传的处理函数
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 */
// 文件上传
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    // console.log(req, file, cb);
    cb(null, "./public/uploads/travel/");
  },
  filename: (req, file, cb) => {
    cb(null, `${Date.now()}-${file.originalname}`);
  },
});

const upload = multer({ storage: storage });

router.post("/upload", upload.array("file"), async (req, res) => {
  try {
    // 处理上传的文件
    const files = req.files;
    const processedFiles = [];

    // 遍历上传的文件
    for (const file of files) {
      // 判断文件类型
      if (file.mimetype.startsWith("image/")) {
        // 如果是图片文件，使用 sharp 转换为 webp 格式
        const webpFilePath = path.join(
          path.dirname(file.path),
          file.filename.replace(/\.[^/.]+$/, ".webp")
        );
        await sharp(file.path)
          .webp()
          .toFormat("webp", { quality: 100 }) // 无损压缩
          .toFile(webpFilePath);

        processedFiles.push(
          `${req.protocol}://${req.headers.host}${path.join(
            "/public/uploads/travel/",
            file.filename.replace(/\.[^/.]+$/, ".webp")
          )}`
        );
      } else if (file.mimetype.startsWith("video/")) {
        // 如果是视频文件，这里我们选择保留原始视频文件
        processedFiles.push(
          `${req.protocol}://${req.headers.host}/${file.path}`
        );
        // 如果需要执行视频转码或其他处理，可以在这里添加逻辑
        // ...
      } else {
        // 如果文件类型不是图片也不是视频，则可以记录错误或忽略该文件
        console.error(`Unsupported file type for ${file.originalname}`);
        // 删除不支持的文件
        await fs.unlink(file.path);
      }
    }
    // 发送响应
    res.send({ code: 200, data: processedFiles });
  } catch (error) {
    // 错误处理
    console.error("Error processing files:", error);
    res.status(500).send({ code: 500, message: "Internal Server Error" });
  }
});
// 删除文件
router.delete("/removeMedia/:filename", (req, res) => {
  const filePath = "./public/uploads/travel/" + req.params.filename;
  // 检查文件是否存在
  fs.access(filePath, fs.constants.F_OK, (error) => {
    if (error) {
      console.error("Image does not exist:", error);
      return;
    }

    // 删除文件
    fs.unlink(filePath, (error) => {
      if (error) {
        console.error("Error deleting image:", error);
        return;
      }
      console.log("Image deleted successfully");
    });
  });
  res.send({ code: 200 });
});
// 获取媒体信息
router.get("/getMedia/:id", async (req, res) => {
  const id = req.params.id;
  const result = await getMedia(id);
  res.send(result);
});

router.post("/updateisonline/:id/:isOnline", async (req, res) => {
  const id = parseInt(req.params.id);
  const isOnline = parseInt(req.params.isOnline);
  const result = await updateIsOnline(id, isOnline);
  res.send(result);
});
module.exports = router;
